/**
 * 名晟中鑫是一家专业数字化、智慧化研发和运营的服务提供商，公司本着“星火燎原、创新创业、科技顶天、服务立地”的发展理念，
 * 致力于新型智慧城市的建设和运营，业务包括智慧城市顶层设计咨询、互联网+、智慧政务、智慧医疗、智慧社区、智慧交通、智慧农业、智慧教育、智慧应急等。
 * 积极构建以政府为主导，企业和市民为主体、市场为导向、产学研相结合的推进体系，资源有效整合与共享，不断增强建设智慧城市建设的整体合力，
 * 真正推动民众生存智慧化。
 **/
package com.zj.utils;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;

/**
 * @author zj
 * @version 1.0.0
 * @ClassName DateUtils
 * @Description 日期通用工具
 * @createTime 2024年08月17日 22:05
 */
public class DateUtils {

    /**
     * 默认⽇期格式
     */
    private static final String DEFAULT_PATTERN =
            "yyyy-MM-dd HH:mm:ss";
    /**
     * 默认⽇期格式
     */
    private static final DateTimeFormatter
            DEFAULT_DATE_TIME_FORMATTER =
            DateTimeFormatter.ofPattern(DEFAULT_PATTERN);
    private static final ZoneId DEFAULT_ZONE_ID =
            ZoneId.systemDefault();
    /**
     * LocalDateTime 转 字符串，指定⽇期格式
     * @param pattern
     * @return
     */
    public static String format(LocalDateTime
                                        localDateTime,String pattern){
        DateTimeFormatter formatter =
                DateTimeFormatter.ofPattern(pattern);
        String timeStr =
                formatter.format(localDateTime.atZone(DEFAULT_ZONE_ID));
        return timeStr;
    }
    /**
     * Date 转 字符串, 指定⽇期格式
     * @param time
     * @param pattern
     * @return
     */
    public static String format(Date time,String
            pattern){
        DateTimeFormatter formatter =
                DateTimeFormatter.ofPattern(pattern);
        String timeStr =
                formatter.format(time.toInstant().atZone(DEFAULT_ZONE_ID));
        return timeStr;
    }
    /**
     * Date 转 字符串，默认⽇期格式
     * @param time
     * @return
     */
    public static String format(Date time){
        String timeStr =
                DEFAULT_DATE_TIME_FORMATTER.format(time.toInstant().
                        atZone(DEFAULT_ZONE_ID));
        return timeStr;
    }
    /**
     * timestamp 转 字符串，默认⽇期格式
     *
     * @param timestamp
     * @return
     */
    public static String format(long timestamp) {
        String timeStr =
                DEFAULT_DATE_TIME_FORMATTER.format(new
                        Date(timestamp).toInstant().atZone(DEFAULT_ZONE_ID))
                ;
        return timeStr;
    }
    /**
     * 字符串 转 Date
     *
     * @param time
     * @return
     */
    public static Date strToDate(String time) {
        LocalDateTime localDateTime =
                LocalDateTime.parse(time,
                        DEFAULT_DATE_TIME_FORMATTER);
        return
                Date.from(localDateTime.atZone(DEFAULT_ZONE_ID).toInstant());
    }
    /**
     * 获取当天剩余的秒数,⽤于流包过期配置
     * @param currentDate
     * @return
    Json序列化⼯具类封装
     */
    public static Integer getRemainSecondsOneDay(Date currentDate) {
        LocalDateTime midnight =
                LocalDateTime.ofInstant(currentDate.toInstant(),

                        ZoneId.systemDefault()).plusDays(1).withHour(0).withMinute(0)
                .withSecond(0).withNano(0);
        LocalDateTime currentDateTime =
                LocalDateTime.ofInstant(currentDate.toInstant(),
                        ZoneId.systemDefault());
        long seconds =
                ChronoUnit.SECONDS.between(currentDateTime,
                        midnight);
        return (int) seconds;
    }
}
